package LanQiao;

import java.util.Scanner;

public class demo2 {
    /**    搬走要石
     * 问题描述
     * 住在有顶天的天人Tensi对自己的住处很不满。终于有一天她决定把门前碍眼的要石通通丢掉（怒扔要石）。
     * 控制要石自然是很容易的事，不过也会消耗灵力。假设搬走一块质量为1的要石会消耗1点灵力，
     * 而且由于要石都是连着放置的缘故所以每次除了搬走一颗，也可以搬走连续的任意数量的要石，
     * 自然质量是算在一起的。现在Tensi准备最多使用M次灵力，但是她太懒……所以每次只会使用同量的灵力，
     * 也因为她太烂，所以也不愿意多花一点灵力……现在很懒的Tensi需要你帮她计算最少一次需要消耗多少灵力，
     * 能够在M次内把所有要石都丢到人间去……
     * 输入格式
     * 　　第一行两个数N,M，用一个空格分隔。1<=n<=1000,1<=m<=400
     * 　　表示一共有N颗要石需要搬走已经Tensi最多发动M次灵力。
     * 　　接下来包括N 个正整数 0<=ai<=40000 顺序表示每一颗要石的质量。
     * 输出格式
     * 　　输出一个数T
     * 　　表示Tensi 每次至少消耗T灵力。0<=T<=1000000
     * 　　如果无解输出-1.
     * 样例输入
     * 5 3
     * 1 2 1 1 1
     * 样例输出
     * 3
     */
    public static int N = 1010;
    public static int []arr = new int[N];

    public static boolean func(int mid,int n,int m,int []arr){
        int count = 0,sum = 0;
        for (int i = 0; i < n;) {
            if(sum+arr[i] <= mid){
                sum+=arr[i];
                i++;
            }else if(arr[i] > mid){
                return false;
            }else{
                count++;
                sum = 0;
            }
        }
        return count < m;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        int l = 0,r = 1000_0000,mid;
        while (l<r){
            mid = (l+r)/2;
            if(func(mid,n,m,arr)){
                r = mid;
            }else{
                l = mid+1;
            }
        }
        System.out.println(l);
    }
}
